package com.erd.datacollect.service.ticket;

import com.erd.datacollect.service.ticket.model.*;
import com.erd.datacollect.utils.*;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Type;

import java.util.HashMap;
import java.util.Map;

public class TicketService {
    private static Logger logger= LoggerFactory.getLogger(TicketService.class);
    private String APP_ID="50f98e1b-38ce-c55e-76ee-b0fd136b097c";
    private String KEY="12Hba3C8h";
    private String TENANT_ID="default_tenement";
    private String SERVER_PATH="112.44.228.194:8085";
    //测试设备序号：SN1008611
    private String DEVICE_SN="SN1008611";
    /**
     * 向票务系统发送刷票信息，判断是否为已预约访客
     *
     * @param checkCode 检票码（票号，证件号）
     * @param checkType 1-二维码检票；4-证件号检票·。
     * @param machineType 0-闸机；1-pos机；2-手机
     * @return 返回关于票务检查的结果。此示例始终返回null，实际实现应根据需求返回相应信息。
     */
    public CheckTicketResp checkTicket(String checkCode, int checkType, int machineType){
        CheckTicketReq ticket = new CheckTicketReq(checkCode,checkType,machineType);
        String body=getBody("checkTicket",ticket);
        if(body!=null){
            Map<String,String> header = new HashMap<>();
            header.put("ClientId",DEVICE_SN);
            String url=String.format("http://%s/ticket-api/outExtension/%s",SERVER_PATH,TENANT_ID);
           String result= HttpAPIService.executePost(url,body,header);
           if(result!=null){
               ResponseBody responseBody= null;
               try {
                   responseBody = JsonTool.toObj(result,new TypeReference<ResponseBody>(){});
               } catch (JsonProcessingException e) {
                   logger.error("解析响应报文失败",e);
               }
               if(responseBody!=null&&responseBody.getMsg().equals("success")){
                   CheckTicketResp bean = transferStrToObj(responseBody.getResult(), CheckTicketResp.class);
                   if(bean!=null){
                       return bean;
                   }
               }
           }
            // ("请求结果:{}",result);
        }
        return null;
    }
    public void uploadOrderForm(){

    }
    /**
     * 根据指定的方法和请求体生成加密的请求字符串。
     *
     * @param method 请求的方法名。
     * @param requestBody 请求的主体对象，将被转换为JSON字符串并加密。
     * @return 返回加密后的请求字符串，如果转换或加密过程中出现错误，则返回null。
     */
    private String getBody(String method,
                           Object requestBody){
        // 初始化请求体和请求头对象
        RequestBody body=new RequestBody();
        RequestHead head=new RequestHead();
        // 获取当前时间戳
        long timestamp=System.currentTimeMillis();
        String bodyStr= null;
        try {
            // 尝试将请求体对象转换为JSON字符串
            bodyStr = JsonTool.toJson(requestBody);
        } catch (JsonProcessingException e) {
            // 记录对象转换为JSON失败的错误日志
            logger.error("对象转json失败:{}",e);
            return null;
        }
        // 对JSON字符串进行DES加密
        String by=DesUtil.encrypt(bodyStr,KEY);

        // 生成请求签名
        String sign= MD5Util.computeMD5Hash(APP_ID+method+timestamp+by+KEY);

        // 设置请求头信息
        head.setMethod(method);
        head.setAppId(APP_ID);
        head.setTimestamp(timestamp);
        head.setSign(sign);

        // 设置请求体的加密数据和请求头
        body.setRequestBody(by);
        body.setRequestHead(head);

        String reqBodyStr= null;
        try {
            // 将完整的请求体对象转换为JSON字符串
            reqBodyStr = JsonTool.toJson(body);
        } catch (JsonProcessingException e) {
            // 记录对象转换为JSON失败的错误日志
            logger.error("对象转json失败:{}",e);
            return null;
        }
        // 对JSON字符串进行Base64编码
        String reqBd=Base64Util.encodeBase64(reqBodyStr);
        return reqBd;
    }
    private <T> T transferStrToObj(String code,Class<T> clazz){
        String jsonStr = DesUtil.decrypt(code,KEY);
        if(jsonStr==null) return null;
        T obj=null;
        try {
            obj= JsonTool.toObj(jsonStr, new TypeReference<T>() {
                @Override
                public Type getType() {
                    return clazz;
                }
            });
            return obj;
        } catch (JsonProcessingException e) {
            logger.error("json转对象失败:{}",e);
        }
        return null;
    }
    public static void main(String[] args) {
        //测试票号：1SGUMAL7ZY1Y2
        String ticket="1SGUMAL7ZY1Y2";
        TicketService service=new TicketService();
        CheckTicketResp result = service.checkTicket(ticket,1,0);
        System.out.println(result.toString());
    }
}
